/* 
 * File:   UnitOfWorkParser.cpp
 * Author: max
 * 
 * Created on March 30, 2013, 10:18 AM
 */

#define EMPTY_DATA 1

#include <fstream>
#include <sstream>
#include "UnitOfWork.h"
#include "UnitOfWorkParser.h"
#include "MangleFactory.h"
#include "Revert.h"

using namespace TP3::Working;

UnitOfWorkParser::UnitOfWorkParser() {}

UnitOfWorkParser::~UnitOfWorkParser() {
}

/* parse:
 *      lee del archivo de reglas las reglas que definen una unidad de trabajo.
 * Las hidrata una por una, en forma secuencial y a medida que van siendo leidas
 * en el archivo, y crea una unidad de trabajo a partir de dichas reglas.
 * 
 * Pre:
 *      El archivo referenciado por path debe existir.
 *      El archivo referenciado por path debe estar bien formado.
 * Pos:
 *      Retorna una Unidad de trabajo.
 */
UnitOfWork* UnitOfWorkParser::parse (string path, char delimiterOfDescriptor, ostream* outPut) throw (int) {
    
    UnitOfWork* work = NULL;
    
    try
    {
        ifstream input (path.c_str(), ios::in);
        if (!input.is_open())
            throw IO_ERROR;

        MangleFactory factory;
        Descriptor descriptor (delimiterOfDescriptor);
        work = new UnitOfWork(outPut);

        while (! input.eof())
        {
            input >> descriptor;
            Mangle* mangle = factory.create(descriptor); 
            
            if (NULL != mangle)
                work->addMangle(mangle);
        }

        input.close();
    }
    catch (int ex)
    {
        if (NULL != work)
        {
            delete work;
            work = NULL;
        }
        
        if (IO_ERROR)
            throw ex;
    }
    
    return work;
}
